package com.foreknow.proxy.staticproxy;

/**
 * 代理类
 * 代理模式的主要角色有：
 *
 * 抽象主题（Subject）：定义了代理对象和目标对象的共同接口，在Java中通常是一个接口或抽象类。
 * 目标对象（RealSubject）：定义了代理对象所代表的真实对象，是业务逻辑的具体执行者。
 * 代理对象（Proxy）：持有对目标对象的引用，并实现了与目标对象相同的接口，在方法调用前后进行额外操作。
 *
 * 静态代理的特点：
 * 需要手动编写代理类，工作量较大（因为代理类也要实现接口，所以在重写方法的时候需要在调用方法的前后都要做一些操作）。
 * 目标对象必须实现接口。
 * 代理类和目标类的关系在编译时就确定了，无法动态改变。
 */
public class CompanyProxy implements SuperMarketAction {
    private SuperMarketImpl superMarket; //目标对象
    //定义构造器用于初始化目标对象
    public CompanyProxy(SuperMarketImpl superMarket) {
        this.superMarket = superMarket;
    }
    @Override
    public void deliver() {
        System.out.println("代理类调用方法之前要做的操作");
        superMarket.deliver();
        System.out.println("代理类调用方法之后要做的操作");
    }

    public static void main(String[] args) {
        SuperMarketImpl superMarket = new SuperMarketImpl();
        CompanyProxy companyProxy = new CompanyProxy(superMarket);
        companyProxy.deliver();
    }
}
